香蕉生產線
跟RxJS
到底有什麼關係!!??Empty Your Mind
coding
系統,方便、快速,就是你學習RxJS
的好幫手。RxJS
的項目,就可以快速地開啟RxJS
的環境來練習囉,是不是很佛心啊!!咱們的目標,是要快速地先上手
RxJS
,安裝相關的知識,等到我們學會之後,自然能心平氣和地安裝。網路上很多搞定本地端安裝的資料,別擔心。
香蕉生產線
為例子,香蕉是我們的來源(source)
,也就是我們要觀察的目標(Observable)
Oberservable
物件,用一個變數命名為Obs$
來承接它,加上$
錢字號能幫助我們快速辨識Observable
物件。Observable
物件的參數,是一個function
,function的attribute
,則是一個subscriber
。✍
subscriber
的細節,我們先賣個關子,待會你就會了解它的來龍去脈囉。
import { Observable } from 'rxjs';
// 第一步:建立一個 ~ 被觀察的目標(Observable)
const obs$ = new Observable((subscriber) => {
subscriber.next('1'); // 第1批香蕉
subscriber.next('2'); // 第2批香蕉
subscriber.next('3'); // 第3批香蕉
subscriber.next('4'); // 第4批香蕉
subscriber.next('5'); // 第5批香蕉
subscriber.complete(); // 結束!
});
subscriber.next(data)
不斷地將資料一筆一筆的送出,再第五筆送出後,下達complete
的指令。Observable
物件提供subscribe()
,裡面我們放了一個(data)=>console.log(data)
,承接資料,印出。obs$.subscribe((data)=>console.log(data)); //陸續印出: 1 2 3 4 5
next
: 往下傳遞資料error
: 發生錯誤,中止運作,進行除錯(Debug)complete
: 結束任務,中止運作物件(Object)
形式建立這三個技能,並設定對應的function
功能。
complete()
沒有attribute
,完成就代表結束,不會再拿到任何資料囉!
// 第二步:建立一個觀察者(Observer)
const observer = {
next: (data) => console.log(`checked ${data}, next!`),
error: (err) => console.log(`error is occured: ${err}}`),
complete: () => console.log(`complete`),
};
...
obs$.subscribe(observer);
// checked 1, next!
// checked 2, next!
// checked 3, next!
// checked 4, next!
// checked 5, next!
觀察者(Observer)
放入訂閱的清單中,對被觀察者(Obervable)
來說,是不是代表這位觀察者就是我的訂閱者(Subscriber)
呢!!subscriber.next(傳遞的資料)
,是不是茅塞頓開了啊!error
代表著生產出現問題,需要立即停止,跟complete一樣,我們修改一下程式來觀察一下結果。
case1: 使用complete來結束
// 第一步:建立一個 ~ 被觀察的目標(Observable)
const obs$ = new Observable((subscriber) => {
subscriber.next('1'); // 第1批香蕉
subscriber.next('2'); // 第2批香蕉
subscriber.next('3'); // 第3批香蕉
subscriber.next('4'); // 第4批香蕉
subscriber.next('5'); // 第5批香蕉
subscriber.complete(); // <-------------complete 結束!
subscriber.next('6'); // 第6批香蕉
subscriber.next('7'); // 第7批香蕉
subscriber.next('8'); // 第7批香蕉
});
// 第二步:建立一個觀察者(Observer)
const observer = {
next: (data) => console.log(`checked ${data}, next!`),
error: (err) => console.log(`error is occured: ${err}}`),
complete: () => console.log(`complete`),
};
obs$.subscribe(observer); // 加入觀察者Observer訂閱
complete
呼叫後,代表生產也結束,6,7,8自然不會印出來囉!
case2: 在complete之前呼叫error
// 第一步:建立一個 ~ 被觀察的目標(Observable)
const obs$ = new Observable((subscriber) => {
subscriber.next('1'); // 第1批香蕉
subscriber.next('2'); // 第2批香蕉
subscriber.next('3'); // 第3批香蕉
subscriber.error('Oops~~~'); // <------------- error is occured: Oops~~~
subscriber.next('4'); // 第4批香蕉
subscriber.next('5'); // 第5批香蕉
subscriber.complete(); // <------------- complete 結束!
subscriber.next('6'); // 第6批香蕉
subscriber.next('7'); // 第7批香蕉
subscriber.next('8'); // 第7批香蕉
});
...
error()
呼叫之後,馬上停止生產,用意就是要讓使用者去進一步檢查,概念就是這樣,是不是很Easy啊。被觀察者(Observable)
來說,觀察者(Observer)
加入訂閱(subscribe)
,自然成了訂閱者(Subscriber)
囉!Observable
的變數尾巴,加上$
錢字號,對未來在review code時會有很大的幫助喔!